//package ByteDance
package main

import "strconv"

// 计算逻辑表达式（解析规则）
var exp bool
var m = map[int]bool{
	1: true,
	2: false,
	3: true,
	4: false,
	5: true,
}

func calc(str string) bool {
	for i := 0; i < len(str); i++ {
		s := str[i]
		if s == '&' {
			return exp && calc(str[i+1:])
		} else if s == '|' {
			return exp || calc(str[i+1:])
		} else if s == '(' {
			size := 1
			j := i + 1
			for ; j < len(str) && size > 0; j++ {
				if str[j] == ')' {
					size--
				} else if str[j] == '(' {
					size++
				}
			}
			exp = calc(str[i+1 : j-1])
			if j == len(str) {
				return exp
			}
			i = j - 1
		} else {
			data, _ := strconv.Atoi(string(s))
			exp = m[data]

			if len(str) == 1 {
				return exp
			}
		}
	}

	panic("error expression")
}

func CalcExpressionMain() {
	expression := "(1|2)&((2&3))&(4|5)"
	result := calc(expression)
	println(result)
}
